/*  
Copyright Microsoft Corporation

Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy of
the License at 

http://www.apache.org/licenses/LICENSE-2.0 

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED 
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, 
MERCHANTABLITY OR NON-INFRINGEMENT. 

See the Apache 2 License for the specific language governing permissions and
limitations under the License. */

using System;
using System.Collections.Generic;
using System.Linq;
using MileageStats.Domain.Contracts.Data;
using MileageStats.Domain.Models;

namespace MileageStats.Data.InMemory
{
    public class ReminderRepository : InMemoryRepository<Reminder>, IReminderRepository
    {

        public void Create(int vehicleId, Reminder reminder)
        {
            reminder.VehicleId = vehicleId;
            base.Create(reminder);
        }

        public Reminder GetReminder(int reminderId)
        {
            return Set.FirstOrDefault(v => v.ReminderId == reminderId);
        }

        public IEnumerable<Reminder> GetOverdueReminders(int vehicleId, DateTime forDate, int odometer)
        {
            return Set
                    .Where(r => (r.VehicleId == vehicleId) && (r.DueDate < forDate || r.DueDistance < odometer) && !r.IsFulfilled)
                    .ToList();
        }

        public IEnumerable<Reminder> GetUpcomingReminders(int vehicleId, DateTime forStartDate, DateTime forEndDate,
                                                          int odometer, int warningOdometer)
        {
            return Set
                .Where(
                    r => (r.VehicleId == vehicleId) && !r.IsFulfilled &&
                         ((r.DueDate > forStartDate && r.DueDate < forEndDate) ||
                          (r.DueDistance > odometer && r.DueDistance <= odometer + warningOdometer)))
                          .ToList();
        }

        public IEnumerable<Reminder> GetRemindersForVehicle(int vehicleId)
        {
            return Set
                .Where(v => v.VehicleId == vehicleId)
                .ToList();
        }
    }
}
